From d2f664abe8f8f0159bd7d11390b332f14047b7a9 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 20 Sep 2012 09:22:55 +0200 Subject: [PATCH] ACPI: move tables.c fully into .init.* The only non-init item was the space reserved for the initial tables, but we can as well dynamically allocate that array. Signed-off-by: Jan Beulich Acked-by: Keir Fraser --- xen/drivers/acpi/Makefile | 2 +- xen/drivers/acpi/osl.c | 36 +++++++++++++++++++++++++++++ xen/drivers/acpi/tables.c | 4 +--- xen/include/acpi/platform/aclinux.h | 10 +++++--- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/xen/drivers/acpi/Makefile b/xen/drivers/acpi/Makefile index abc66f8a07..bbb06a7468 100644 --- a/xen/drivers/acpi/Makefile +++ b/xen/drivers/acpi/Makefile @@ -2,7 +2,7 @@ subdir-y += tables subdir-y += utilities subdir-$(x86) += apei -obj-y += tables.o +obj-bin-y += tables.init.o obj-y += numa.o obj-y += osl.o obj-y += pmstat.o diff --git a/xen/drivers/acpi/osl.c b/xen/drivers/acpi/osl.c index dd96a1a20e..1b60be621c 100644 --- a/xen/drivers/acpi/osl.c +++ b/xen/drivers/acpi/osl.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -182,3 +183,38 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) return AE_OK; } + +#define is_xmalloc_memory(ptr) ((unsigned long)(ptr) & (PAGE_SIZE - 1)) + +void *__init acpi_os_alloc_memory(size_t sz) +{ + void *ptr; + + if (system_state == SYS_STATE_early_boot) + return mfn_to_virt(alloc_boot_pages(PFN_UP(sz), 1)); + + ptr = xmalloc_bytes(sz); + ASSERT(!ptr || is_xmalloc_memory(ptr)); + return ptr; +} + +void *__init acpi_os_zalloc_memory(size_t sz) +{ + void *ptr; + + if (system_state != SYS_STATE_early_boot) { + ptr = xzalloc_bytes(sz); + ASSERT(!ptr || is_xmalloc_memory(ptr)); + return ptr; + } + ptr = acpi_os_alloc_memory(sz); + return ptr ? memset(ptr, 0, sz) : NULL; +} + +void __init acpi_os_free_memory(void *ptr) +{ + if (is_xmalloc_memory(ptr)) + xfree(ptr); + else if (ptr && system_state == SYS_STATE_early_boot) + init_boot_pages(__pa(ptr), __pa(ptr) + PAGE_SIZE); +} diff --git a/xen/drivers/acpi/tables.c b/xen/drivers/acpi/tables.c index d1136a8f80..a0e9c163a8 100644 --- a/xen/drivers/acpi/tables.c +++ b/xen/drivers/acpi/tables.c @@ -41,8 +41,6 @@ mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" }; static const char *__initdata mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" }; -static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES]; - static int acpi_apic_instance __initdata; void __init acpi_table_print_madt_entry(struct acpi_subtable_header *header) @@ -324,7 +322,7 @@ static void __init check_multiple_madt(void) int __init acpi_table_init(void) { - acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); + acpi_initialize_tables(NULL, ACPI_MAX_TABLES, 0); check_multiple_madt(); return 0; } diff --git a/xen/include/acpi/platform/aclinux.h b/xen/include/acpi/platform/aclinux.h index daa2d7e985..239ced2352 100644 --- a/xen/include/acpi/platform/aclinux.h +++ b/xen/include/acpi/platform/aclinux.h @@ -76,8 +76,12 @@ #define acpi_thread_id struct vcpu * -#define ACPI_ALLOCATE(a) xmalloc_bytes(a) -#define ACPI_ALLOCATE_ZEROED(a) xzalloc_bytes(a) -#define ACPI_FREE(a) xfree(a) +void *acpi_os_alloc_memory(size_t); +void *acpi_os_zalloc_memory(size_t); +void acpi_os_free_memory(void *); + +#define ACPI_ALLOCATE(a) acpi_os_alloc_memory(a) +#define ACPI_ALLOCATE_ZEROED(a) acpi_os_zalloc_memory(a) +#define ACPI_FREE(a) acpi_os_free_memory(a) #endif /* __ACLINUX_H__ */ -- 2.30.2